package gainian;


import org.junit.Test;

/**
 * @Auther ljn
 * @Date 2019/12/23
 * 类中静态和非静态的顺序
 */
public class LeiDeShunXu {
    /*
       只调用父类,子类的静态和构造代码块和构造方法都不会执行
     */
    @Test
    public void test1(){
        A a = new A();
    }

    /*
       生成子类时:父类静态->子类静态->父类构造代码块->父类构造方法->子类构造代码块->子类构造方法
     */
    @Test
    public void test2(){
        B b = new B();
    }

    /*
       static final int i = 100; 不会调用类A的静态代码块
     */
    @Test
    public void test3(){
        System.out.println(A.i);
    }

    /*
        这里要访问B.j数据,不仅仅会加载B类的静态,同时也会加载A类的静态
        A static block
        B static block
        50

        注意:如果类B中写 final static int j = 50;的话只会打印50,并不会
        执行A和B中的静态代码块
     */
    @Test
    public void test4(){
        System.out.println(B.j);
    }


    /*
       访问public static final 基本类型 or String;这样的属性不会触发类的静态代码块
     */
    @Test
    public void test5(){
        System.out.println(A.i_final);
        //System.out.println(B.j_final);
    }



}


class A{

    static final int i = 100; //static final i 会写入到常量池中,不会调用静态代码块

    final static String i_final = new String("a");//new的对象会触发初始化

    static {
        System.out.println("A static block");
    }

    A(){
        System.out.println("A constructor");
    }

    {
        System.out.println("A non-static block");
    }

}

class B extends A{

    static int j = 50;

    final static String j_final = "aaa";

    static {
        System.out.println("B static block");
    }

    B(){
        System.out.println("B constructor");
    }

    {
        System.out.println("B non-static block");
    }

}

